def chk(c, p):
    # 检查第 c 个位置是否合法，避免两个皇后处于同一对角线
    for i in range(1, c):
        if abs(c - i) == abs(p[i] - p[c]):  # 同一对角线
            return False
    return True

def dfs(cnt, n, p, vis):
    global ans
    # 当已经排列的元素数量等于 n 时，找到一个合法解，答案加一
    if cnt == n:
        ans += 1
        return

    # 遍历所有数字，从 1 到 n
    for i in range(1, n + 1):
        if not vis[i]:  # 如果数字 i 没有被使用
            vis[i] = 1  # 标记为已使用
            p[cnt + 1] = i  # 将数字 i 放入当前排列
            # 如果当前排列合法，则递归进行
            if chk(cnt + 1, p):
                dfs(cnt + 1, n, p, vis)
            # 回溯，撤销选择
            p[cnt + 1] = 0
            vis[i] = 0

# 排列 的 一种 第i个数字 选 or 不选
def main():
    global ans
    n = int(input())  # 输入 n
    p = [0] * (n + 1)  # 用于存储当前排列
    vis = [0] * (n + 1)  # 标记每个数字是否已被使用
    ans = 0  # 解的数量
    dfs(0, n, p, vis)  # 从第 0 个位置开始，排列的元素数量为 0
    print(ans)  # 输出合法解的数量

if __name__ == "__main__":
    main()